home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ccdl150l.zip / ALLOC / FREE.C < prev    next >
C/C++ Source or Header  |  1996-07-25  |  1KB  |  62 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <libp.h>
  6.  
  7. extern void *_allocbloc;
  8. extern int _allocflag;
  9.  
  10. static void memlink(char *buf)
  11. {
  12.     BLKHEAD *blist = _allocbloc;
  13.     FREELIST *lpa = (size_t *)buf - 1;
  14.     while (blist) {
  15.         if (buf > blist && buf < blist->list + blist->list->size)
  16.             break;
  17.         blist=blist->next;
  18.     }
  19.     if (blist) {
  20.         FREELIST *lp2 = 0,*lp = blist->list;
  21.         while (lp) {
  22.             if (lp == buf)
  23.                 break;
  24.             if (lp > buf) {
  25.                 if (lp2 && ((char *)lp2+lp2->size == lpa)) {
  26.                     lp2->size += lpa->size + sizeof(size_t);
  27.                     if (lp2->size + (char *)lp2 == lp) {
  28.                         lp2->size += lp->size;
  29.                         lp2->next = lp->next;
  30.                     }
  31.                 }
  32.                 else {
  33.                     lpa->size = lpa->size + sizeof(size_t);
  34.                     if (lp2) {
  35.                         lpa->next = lp2->next;
  36.                         lp2->next = lpa;
  37.                     }
  38.                     else {
  39.                         lpa->next = blist->list;
  40.                         blist->list = lpa;
  41.                     }
  42.                     if (lpa->size + (char *)lpa == lp) {
  43.                         lpa->size += lp->size;
  44.                         lpa->next = lp->next;
  45.                     }
  46.                 }
  47.                 return;
  48.             }
  49.             lp2 = lp;
  50.             lp = lp->next;
  51.         }
  52.     }
  53. }
  54.  
  55. void free(void *buf)
  56. {
  57.     while (_allocflag)
  58.         _ll_transfer();
  59.     _allocflag = 1;
  60.     memlink((char *)buf);
  61.     _allocflag = 0;
  62. }